/**
 * @typedef {Object} NodeTree
 * @property {String} [id] 结点素材id
 * @property {String} path 结点路径
 * @property {String} name 结点类名
 * @property {String} [text] 结点文本
 * @property {String} [description] 结点介绍
 * @property {String} [packageName] 结点包名，只有根结点才有此属性
 * @property {Array<NodeTree>} [children] 子结点
 */

/**
 * @typedef {Object} EventData
 * @property {String} className 事件类名
 * @property {Number} nid 通知id
 * @property {String} packageName 事件包名
 * @property {String} text 事件文本
 * @property {String} type 事件类型
 */

/**
 * 辅助api接口
 */
class Shell {
    /**
     * sleep一段时间
     * @param {Number} ms 阻塞毫秒数
     * @return {Boolean}
     **/
    sleep(ms) {}
    /**
     * 模拟 Home 键
     **/
    back2Home() {}
    /**
     * 打开系统辅助功能设置
     **/
    openSetting() {}
    /**
     * 是否已锁屏
     * @return {Boolean}
     **/
    isScreenLocked() {}
    /**
     * 唤醒并解锁手机
     * 仅支持没有锁屏密码时
     **/
    wakeAndUnlock() {}
    /**
     * 打开指定的软件
     * @param {String} packageName 要启动的软件包名,如,微信: com.tencent.mm
     * @param {String} [className] 要启动的Activity名,不常用
     **/
    open(packageName, className) {}
    /**
     * 使用浏览器打开
     * @param {String} url 要打开的链接
     **/
    openUrl(url) {}
    // /**
    //  * 执行一段shell命令
    //  * @param {String} cmd shell命令,如: ls /storage/emulated/0/
    //  * @return {String} shell命令执行后的输出
    //  **/
	// exec(cmd) {}
	//  /**
    //  * 将文本写入文件,根源于本软件的files目录Context.getFilesDir()
    //  * @param {String} filename 文件名
    //  * @param {String} text 想要写入的文本
    //  * @return {Boolean}
    //  **/
    // writeFile(filename, text) {}
    // /**
    //  * 读取文件,根源于本软件的files目录Context.getFilesDir()
    //  * @param {String} filename 文件名
    //  * @return {String} 文件文本内容
    //  **/
    // readFile(filename) {}
    // /**
    //  * 删除文件
    //  * @param {String} filename 文件名
    //  **/
    // removeFile(filename) {}
    // /**
    //  * 如果目录不存在则创建目录，会父目录不存在时也会被创建
    //  * @param {String} filename 目录名
    //  * @return {Boolean}
    //  **/
    // mkdirs(filename) {}
    // /**
    //  * 获取指定目录下的文件
    //  * @param {String} filename 目录名
    //  * @return {String} 多个文件，用逗号分隔，如:"script,scripts.json,"
    //  **/
    // readDir(filename) {}
    // /**
    //  * 文件是否存在
    //  * @param {String} filename 文件名
    //  * @return {Boolean}
    //  **/
    // existFile(filename) {}
    // /**
    //  * 目录是否存在
    //  * @param {String} filename 目录名
    //  * @return {Boolean}
    //  **/
    // existDir(filename) {}
    /**
     * 复制一段文本到剪切板
     * @param {String} text 想要复制的文本
     **/
    pbcopy(text) {}
    /**
     * 执行粘贴操作,并返回当前剪切板中的文本
     * @return {String}
     **/
    pbpaste() {}
    /**
     * 获取files目录路径,Context.getFilesDir()
     * @return {String} 如: /data/user/0/cn.inu1255.threehands/files
     **/
    getPath() {}
    /**
     * @param {String} text 要显示的字符串
     * @param {Number} duration 要显示的时间(毫秒)
     **/
    toast(text, duration) {}
    /**
     * 获取系统中安装的软件(执行很慢)
     * @return {String} json字符串,如: [{"name":"屏幕录制","packageName":"com.miui.screenrecorder"}]
     **/
    getPackages() {}
    /**
     * 辅助功能是否启用
     * @return {Boolean}
     **/
    enabled() {}
    /**
     * 截屏并保存在外存的 threehands/screen.png 文件中，多次执行文件会被覆盖
     * 如: /storage/emulated/0/Android/data/cn.inu1255.threehands/files/threehands/screen.png
     * @return {Boolean}
     **/
    screenshot() {}
    /**
     * 计算微信跳一跳距离, w*x+b
     * @param {Number} w 跳跃系数(倍数)
     * @param {Number} b 跳跃基数
     * @return {Number} 按下毫秒数
     **/
    wechatJump(w, b) {}
    /**
     * 获取截图所在路径
     * @return {String}
     **/
    screenPath() {}
    /**
     * 获取当前软件版本
     * @return {Number}
     **/
    getLocalVersion() {}
    /**
     * 获取当前界面的UI结构
     * @return {NodeTree}
     **/
    getView() {}
    /**
     * 返回第一个满足条件的结点
     * @param {NodeTree} [data] 要查找的ui树，默认从getView()获取
     * @param {{Function(x:NodeTree):Boolean}} filter 条件函数,传入结点，满足条件时返回true
     * @returns {NodeTree}
     */
    find(data, filter) {}
    /**
     * 模拟点击通知消息
     * @param {Number} nid 通知编号,通过脚本的TYPE_NOTIFICATION_STATE_CHANGED事件获取到通知编号
     * @return {Boolean}
     **/
    openNotify(nid) {}
    /**
     * 模拟点击一个ui结点
     * @param {String} selector 要点击的ui结点, ".foo"代表点击text为foo的结点,"#foo"代表点击id为foo的结点,">1>2"代表点击path为">1>2"的结点
     * 通常使用">1>2"这样的path选择
     * @return {Number} 点击结点数量
     **/
    click(selector) {}
    /**
     * 模拟输入
     * @param {String} selector 要点击的ui结点, ".foo"代表点击text为foo的结点,"#foo"代表点击id为foo的结点,">1>2"代表点击path为">1>2"的结点
     * 通常使用">1>2"这样的path选择
     * @param {String} text 输入文本
     * @return {Number} 输入结点数量
     **/
    input(selector, text) {}
    /**
     * 模拟back键
     * @return {Boolean}
     **/
    pressBack() {}
    /**
     * 模拟Home键
     * @return {Boolean}
     **/
    pressHome() {}
    /**
     * 获取屏幕像素值
     * @return {String} 以逗号分隔,"宽,高",如: "1080,1920"
     **/
    getSize() {}
    /**
     * 模拟滑动
     * @param {Number} x1 起点x坐标
     * @param {Number} y1 起点y坐标
     * @param {Number} x2 终点x坐标
     * @param {Number} y2 终点y坐标
     * @param {Number} [ms] 滑动时间(毫秒)
     * @return {Boolean}
     **/
    swipe(x1, y1, x2, y2, ms) {}
    /**
     * 模拟右滑
     * @return {Boolean}
     **/
    swipeRight() {}
    /**
     * 模拟左滑
     * @return {Boolean}
     **/
    swipeLeft() {}
    /**
     * 模拟下滑
     * @return {Boolean}
     **/
    swipeDown() {}
    /**
     * 模拟上滑
     * @return {Boolean}
     **/
    swipeUp() {}
}

/**
 * 辅助脚本类
 */
class Script {
    constructor() {
        // 脚本名
        this.title = "微信抢红包";
        // 脚本介绍
        this.description = "收到微信红包通知会自动抢\n1.最好在聊天界面,因为群聊消息太多会没有通知\n2.如果多个群聊请在会话列表页面";
        // 脚本需要获取哪些软件的事件,要获取所有软件信息时 this.package = "all"
        this.package = ["com.tencent.mm", "android"];
        // 脚本可以定义的参数
        this.params = [];
    }
    /**
     * 获取辅助脚本
     * @param {Shell} shell 
     * @param {Map<String,String>} param 用户设置的参数,在this.params中定义
     */
    script(shell, param) {
        return {
            /**
             * 窗口切换事件
             * @param {EventData} data 
             */
            TYPE_WINDOW_STATE_CHANGED(data) {},
            /**
             * 窗口内容变化事件
             * @param {EventData} data 
             */
            TYPE_WINDOW_CONTENT_CHANGED(data) {},
            /**
             * 收到推送通知事件
             * @param {EventData} data 
             */
            TYPE_NOTIFICATION_STATE_CHANGED(data) {},
            /**
             * 用户在手替app中，点击执行按钮
             */
            run() {}
        };
    };
}